Optimalisering av JavaScript-modulgraf: Forenkling av avhengighetsgrafen | MLOG | MLOG
            document.addEventListener("DOMContentLoaded", function() {
 var lazyloadImages = document.querySelectorAll("img.lazy");

 function lazyload () {
 lazyloadImages.forEach(function(img) {
 if (img.offsetTop < (window.innerHeight + window.pageYOffset)) {
 img.src = img.dataset.src;
 img.classList.remove("lazy");
 }
 });
 if(lazyloadImages.length === 0) {
 document.removeEventListener("scroll", lazyload);
 window.removeEventListener("resize", lazyload);
 window.removeEventListener("orientationChange", lazyload);
 }
 }

 document.addEventListener("scroll", lazyload);
 window.addEventListener("resize", lazyload);
 window.addEventListener("orientationChange", lazyload);
 });
            

Praktisk innsikt: Implementer lat lasting for bilder, videoer og andre ressurser som ikke er umiddelbart synlige på skjermen. Vurder å bruke biblioteker som `lozad.js` eller nettleserens innebygde lat-lastingsattributter.

6. Tree Shaking og eliminering av død kode

Tree shaking er en teknikk som fjerner ubrukt kode fra applikasjonen din under byggeprosessen. Dette kan redusere pakkestørrelsen betydelig, spesielt hvis du bruker biblioteker som inkluderer mye kode du ikke trenger.

Eksempel:

Anta at du bruker et verktøybibliotek som inneholder 100 funksjoner, men du bruker bare 5 av dem i applikasjonen din. Uten tree shaking ville hele biblioteket blitt inkludert i pakken din. Med tree shaking ville bare de 5 funksjonene du bruker blitt inkludert.

Konfigurasjon:

Sørg for at bundleren din er konfigurert til å utføre tree shaking. I webpack er dette vanligvis aktivert som standard når du bruker produksjonsmodus. I Rollup kan det være nødvendig å bruke `@rollup/plugin-commonjs`-pluginen.

Praktisk innsikt: Konfigurer bundleren din til å utføre tree shaking og sørg for at koden din er skrevet på en måte som er kompatibel med tree shaking (f.eks. ved bruk av ES-moduler).

7. Minimere avhengigheter

Antallet avhengigheter i prosjektet ditt kan direkte påvirke kompleksiteten i modulgrafen. Hver avhengighet legger til i grafen, noe som potensielt øker byggetider og pakkestørrelser. Gjennomgå jevnlig avhengighetene dine og fjern de som ikke lenger er nødvendige eller kan erstattes med mindre alternativer.

Eksempel:

I stedet for å bruke et stort verktøybibliotek for en enkel oppgave, vurder å skrive din egen funksjon eller bruke et mindre, mer spesialisert bibliotek.

Praktisk innsikt: Gjennomgå jevnlig avhengighetene dine med verktøy som `npm audit` eller `yarn audit` og identifiser muligheter for å redusere antall avhengigheter eller erstatte dem med mindre alternativer.

8. Analysere pakkestørrelse og ytelse

Analyser jevnlig pakkestørrelsen og ytelsen for å identifisere områder for forbedring. Verktøy som webpack-bundle-analyzer og Lighthouse kan hjelpe deg med å identifisere store moduler, ubrukt kode og ytelsesflaskehalser.

Eksempel (webpack-bundle-analyzer):

Legg til `webpack-bundle-analyzer`-pluginen i din webpack-konfigurasjon.

            const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
 // ... other webpack configuration
 plugins: [
 new BundleAnalyzerPlugin()
 ]
};

            

Når du kjører bygget, vil pluginen generere et interaktivt tre-kart (treemap) som viser størrelsen på hver modul i pakken din.

Praktisk innsikt: Integrer pakkeanalyseverktøy i byggeprosessen din og gjennomgå resultatene jevnlig for å identifisere områder for optimalisering.

9. Modulføderasjon (Module Federation)

Modulføderasjon, en funksjon i webpack 5, lar deg dele kode mellom forskjellige applikasjoner under kjøring. Dette kan være nyttig for å bygge mikro-frontends eller for å dele felles komponenter mellom forskjellige prosjekter. Modulføderasjon kan bidra til å redusere pakkestørrelser og forbedre ytelsen ved å unngå duplisering av kode.

Eksempel (Grunnleggende oppsett for Modulføderasjon):

Applikasjon A (Vert):

            // webpack.config.js
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
 // ... other webpack configuration
 plugins: [
 new ModuleFederationPlugin({
 name: "appA",
 remotes: {
 appB: "appB@http://localhost:3001/remoteEntry.js",
 },
 shared: ["react", "react-dom"]
 })
 ]
};

            

Applikasjon B (Fjern):

            // webpack.config.js
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
 // ... other webpack configuration
 plugins: [
 new ModuleFederationPlugin({
 name: "appB",
 exposes: {
 './MyComponent': './src/MyComponent',
 },
 shared: ["react", "react-dom"]
 })
 ]
};

            

Praktisk innsikt: Vurder å bruke Modulføderasjon for store applikasjoner med delt kode eller for å bygge mikro-frontends.

Spesifikke hensyn for bundlere

Forskjellige bundlere har forskjellige styrker og svakheter når det gjelder optimalisering av modulgrafen. Her er noen spesifikke hensyn for populære bundlere:

Webpack

Rollup

Parcel

Globalt perspektiv: Tilpasse optimaliseringer for ulike kontekster

Når man optimaliserer modulgrafer, er det viktig å vurdere den globale konteksten applikasjonen skal brukes i. Faktorer som nettverksforhold, enhetskapasiteter og brukerdemografi kan påvirke effektiviteten av ulike optimaliseringsteknikker.

Konklusjon

Optimalisering av JavaScript-modulgrafen er et avgjørende aspekt ved front-end-utvikling. Ved å forenkle avhengigheter, fjerne sirkulære avhengigheter og implementere kodesplitting, kan du forbedre byggeytelsen, redusere pakkestørrelsen og øke innlastingstiden for applikasjonen betydelig. Analyser jevnlig pakkestørrelsen og ytelsen for å identifisere områder for forbedring, og tilpass optimaliseringsstrategiene dine til den globale konteksten applikasjonen skal brukes i. Husk at optimalisering er en kontinuerlig prosess, og kontinuerlig overvåking og finjustering er avgjørende for å oppnå optimale resultater.

Ved å konsekvent anvende disse teknikkene kan utviklere over hele verden skape raskere, mer effektive og mer brukervennlige webapplikasjoner.